{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3b69b129",
   "metadata": {},
   "source": [
    "# 生成式预训练语言模型：理论与实战\n",
    "深蓝学院 课程 \n",
    "课程链接：https://www.shenlanxueyuan.com/course/620\n",
    "\n",
    "作者 **黄佳**"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3a168a35",
   "metadata": {},
   "source": [
    "## 第1步：构建实验语料库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d3216379",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "词汇表： ['Student', 'is', 'Mazong', 'Boss', 'Xiaoxue', 'Kage', 'Xiaobing', 'Teacher', 'Niuzong']\n",
      "词汇到索引的字典： {'Student': 0, 'is': 1, 'Mazong': 2, 'Boss': 3, 'Xiaoxue': 4, 'Kage': 5, 'Xiaobing': 6, 'Teacher': 7, 'Niuzong': 8}\n",
      "索引到词汇的字典： {0: 'Student', 1: 'is', 2: 'Mazong', 3: 'Boss', 4: 'Xiaoxue', 5: 'Kage', 6: 'Xiaobing', 7: 'Teacher', 8: 'Niuzong'}\n",
      "词汇表大小： 9\n"
     ]
    }
   ],
   "source": [
    "# 定义一个句子列表，后面会用这些句子来训练CBOW和Skip-Gram模型\n",
    "sentences = [\"Kage is Teacher\", \"Mazong is Boss\", \"Niuzong is Boss\",\n",
    "             \"Xiaobing is Student\", \"Xiaoxue is Student\",]\n",
    "# 将所有句子连接在一起，然后用空格分隔成词汇\n",
    "words = ' '.join(sentences).split()\n",
    "# 构建词汇表，去除重复的词\n",
    "word_list = list(set(words))\n",
    "# 创建一个字典，将每个词汇映射到一个唯一的索引\n",
    "word_to_idx = {word: idx for idx, word in enumerate(word_list)}\n",
    "# 创建一个字典，将每个索引映射到对应的词汇\n",
    "idx_to_word = {idx: word for idx, word in enumerate(word_list)}\n",
    "voc_size = len(word_list) # 计算词汇表的大小\n",
    "print(\"词汇表：\", word_list) # 输出词汇表\n",
    "print(\"词汇到索引的字典：\", word_to_idx) # 输出词汇到索引的字典\n",
    "print(\"索引到词汇的字典：\", idx_to_word) # 输出索引到词汇的字典\n",
    "print(\"词汇表大小：\", voc_size) # 输出词汇表大小"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "d564e419",
   "metadata": {},
   "source": [
    "## 第2步：生成Skip-Gram训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "de8f4ae7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram数据样例（未编码）： [('is', 'Kage'), ('Teacher', 'Kage'), ('Kage', 'is'), ('Teacher', 'is'), ('Kage', 'Teacher'), ('is', 'Teacher'), ('is', 'Mazong'), ('Boss', 'Mazong'), ('Mazong', 'is'), ('Boss', 'is'), ('Mazong', 'Boss'), ('is', 'Boss'), ('is', 'Niuzong'), ('Boss', 'Niuzong'), ('Niuzong', 'is'), ('Boss', 'is'), ('Niuzong', 'Boss'), ('is', 'Boss'), ('is', 'Xiaobing'), ('Student', 'Xiaobing'), ('Xiaobing', 'is'), ('Student', 'is'), ('Xiaobing', 'Student'), ('is', 'Student'), ('is', 'Xiaoxue'), ('Student', 'Xiaoxue'), ('Xiaoxue', 'is'), ('Student', 'is'), ('Xiaoxue', 'Student'), ('is', 'Student')]\n"
     ]
    }
   ],
   "source": [
    "# 生成Skip-Gram训练数据\n",
    "def create_skipgram_dataset(sentences, window_size=2):\n",
    "    data = []\n",
    "    for sentence in sentences:\n",
    "        sentence = sentence.split()  # 将句子分割成单词列表\n",
    "        for idx, word in enumerate(sentence):  # 遍历单词及其索引\n",
    "            # 获取相邻的单词，将当前单词前后各N个单词作为相邻单词\n",
    "            for neighbor in sentence[max(idx - window_size, 0): \n",
    "                        min(idx + window_size + 1, len(sentence))]:\n",
    "                if neighbor != word:  # 排除当前单词本身\n",
    "                    # 将相邻单词与当前单词作为一组训练数据\n",
    "                    data.append((neighbor, word))\n",
    "    return data\n",
    "# 使用函数创建Skip-Gram训练数据\n",
    "skipgram_data = create_skipgram_dataset(sentences)\n",
    "# 打印未编码的Skip-Gram数据样例\n",
    "print(\"Skip-Gram数据样例（未编码）：\", skipgram_data)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "1b81e0a8",
   "metadata": {},
   "source": [
    "## 第3步：对Skip-Gram数据进行One-Hot编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "72158e33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One-Hot编码前的单词： Teacher\n",
      "One-Hot编码后的向量： tensor([0., 0., 0., 0., 0., 0., 0., 1., 0.])\n",
      "Skip-Gram数据样例（已编码）： [(tensor([0., 1., 0., 0., 0., 0., 0., 0., 0.]), 5), (tensor([0., 0., 0., 0., 0., 0., 0., 1., 0.]), 5), (tensor([0., 0., 0., 0., 0., 1., 0., 0., 0.]), 1)]\n"
     ]
    }
   ],
   "source": [
    "# 定义One-Hot编码函数\n",
    "import torch # 导入torch库\n",
    "def one_hot_encoding(word, word_to_idx):\n",
    "    # 创建一个全为0的张量，长度与词汇表大小相同\n",
    "    tensor = torch.zeros(len(word_to_idx))  \n",
    "    tensor[word_to_idx[word]] = 1  # 将对应词汇的索引位置置为1\n",
    "    return tensor  # 返回生成的One-Hot向量\n",
    "\n",
    "# 展示One-Hot编码前后的数据\n",
    "word_example = \"Teacher\"\n",
    "print(\"One-Hot编码前的单词：\", word_example)\n",
    "print(\"One-Hot编码后的向量：\", one_hot_encoding(word_example, word_to_idx))\n",
    "\n",
    "# 展示编码后的Skip-Gram数据样例\n",
    "print(\"Skip-Gram数据样例（已编码）：\", [(one_hot_encoding(context, word_to_idx), \n",
    "          word_to_idx[target]) for context, target in skipgram_data[:3]])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "03235c50",
   "metadata": {},
   "source": [
    "## 第4步：定义Skip-Gram模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "31ae5270",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram模型： SkipGram(\n",
      "  (input_to_hidden): Linear(in_features=9, out_features=2, bias=False)\n",
      "  (hidden_to_output): Linear(in_features=2, out_features=9, bias=False)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# 定义Skip-Gram模型\n",
    "import torch.nn as nn # 导入neural network\n",
    "class SkipGram(nn.Module):\n",
    "    def __init__(self, voc_size, embedding_size):\n",
    "        super(SkipGram, self).__init__()\n",
    "        # 从词汇表大小到嵌入大小的线性层（权重矩阵）\n",
    "        self.input_to_hidden = nn.Linear(voc_size, embedding_size, bias=False)  \n",
    "        # 从嵌入大小到词汇表大小的线性层（权重矩阵）\n",
    "        self.hidden_to_output = nn.Linear(embedding_size, voc_size, bias=False)  \n",
    "\n",
    "    def forward(self, X): # X : [batch_size, voc_size]        \n",
    "         # 生成隐藏层：[batch_size, embedding_size]\n",
    "        hidden_layer = self.input_to_hidden(X) \n",
    "        # 生成输出层：[batch_size, voc_size]\n",
    "        output_layer = self.hidden_to_output(hidden_layer)  \n",
    "        return output_layer\n",
    "    \n",
    "embedding_size = 2 # 设定嵌入层的大小，这里选择2是为了方便展示\n",
    "skipgram_model = SkipGram(voc_size,embedding_size)  # 实例化SkipGram模型\n",
    "print(\"Skip-Gram模型：\", skipgram_model)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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qjYADmtJknRN17GelZW1devW06dPu3eAdA7X80m4txNCNmzYMHHixE2bNvXu3dtf1Wvbtu3FixdPnz5dphVaUWHA4eHh4SHBIf6qW2XAUCdpLcPpdN5///1DhgyZMGGCqqqe+fhv/BBjjJcsWfLee++tWLGiU6dOEF3ur1qBGbyesCtaFLrlU0gqBLVUtQR4alVV/eWXX86ePTthwgRUblMAxy5cuPCTTz7ZsGFD69at/V49ggliEdax5/zfigpM0zSY7Ojv2vkZaqlqCbqmsxzrcrkSEhIWL158xx13wMN3vVg7twjBIr300kubN2/esGFDdHS0H5cRqJtQS1VLgJwnn332Wft27fv16wepyDDB15u1CpKDxuH06dN37dq1ffv24OBgqijfoZaq9nDp0qVu3bpt3ry5bdu27mXLbhwVjjEeP358SkrK1q1b69evf0urW3uhlqrGA71/RVFmz5792GOPtWnThhAi8IJ7zPcf35vg4B43btzly5d/+uknqig/QkVV4wH7c+bMmR9//PHUqVOqqkqSxPEciAp5GCj3SBTG2Gq1jn1irKqpW37a4s6fjOpGFHllU90dKZRyMnHixOnTpwuC4J6GeK2XTNM0EI8syw8++CAv8Bs2bKBTd/0OFVUNxuFw6JququrGjRttNtvo0aMFQbhB+jGe5xVFcblc99xzT4sWLb777jtIMUvxL1RUNRiO43Sscxw3ZcqU999/H7KZ33gYp6SkpFevXh07dnz77bcxxoqq3KrK1iFuhajcad39VaB7gYnKW/vZ70DKfOSPOoN5sdlskiSJovjuu++2atXKvTzMtcDkKIRQVlZWjx49EhMT3333XbPZzDAM5GH1sT6UMlS6S51cXeL7+PHj/hoL53m+adOm5Y+8rg7Isux0Oq9cuYIx9lpXhBCWZSVJ0nXdYDBER0dfvHixQ4cOO3bsuGkYxKlTpwYNGvTCCy88++yzdru9zBK3bqijwncq3fsH3t6dO3f++eefPqbwdnPkyJEhQ4Z07NjRL6XdGniOnz9/frt27TDGMBHQOyAvOczJnTZt2htvvPH44483b978BocQQtLS0gYNGvTyyy8/++yzCKHyZ0KmeEGliwrsiaZpAwYM8JcMgoODISjbL6XdGjie4zhu4MCBsLSM1+XAuJOqqvPnzz9+/PimTZv++OMPT4tdJmgV3mhP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"
    }
   },
   "cell_type": "markdown",
   "id": "a0d649e9",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "93dee758",
   "metadata": {},
   "source": [
    "## 第5步：训练Skip-Gram模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "311ccd16",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Loss: 2.1821006774902343\n",
      "Epoch: 200, Loss: 2.1476088722546893\n",
      "Epoch: 300, Loss: 2.1057803789774576\n",
      "Epoch: 400, Loss: 2.0551783363024394\n",
      "Epoch: 500, Loss: 2.001389334599177\n",
      "Epoch: 600, Loss: 1.954955240090688\n",
      "Epoch: 700, Loss: 1.9216339667638143\n",
      "Epoch: 800, Loss: 1.8994188825289409\n",
      "Epoch: 900, Loss: 1.883852987488111\n",
      "Epoch: 1000, Loss: 1.871559727191925\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHFCAYAAAAaD0bAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPTUlEQVR4nO3dd1QU58IG8GeWshSX3gUUKyIBC1jAGiP2aDSJiRU1V4nYYnKTkJjENP3MTTGWoMZC7F1j7BoVGwqoC/YSBFFAsNBhKTvfH5qNRFSUMrvs8ztnzsnOvjM8C+fefZz2CqIoiiAiIiLSIzKpAxARERHVNBYgIiIi0jssQERERKR3WICIiIhI77AAERERkd5hASIiIiK9wwJEREREeocFiIiIiPQOCxARERHpHRYgInoiQRAqtBw6dKhSP2f69OkQBOGFtj106FCVZKjMz964cWON/2wiqhxDqQMQkfaKiooq8/rrr7/GwYMHceDAgTLrvby8KvVz3nnnHfTs2fOFtm3VqhWioqIqnYGI9AsLEBE9Ubt27cq8tre3h0wme2z9v+Xn58PMzKzCP8fV1RWurq4vlNHCwuKZeYiI/o2nwIioUrp06QJvb28cPnwYAQEBMDMzw+jRowEA69atQ1BQEJydnWFqaopmzZrh448/Rl5eXpl9lHcKrH79+ujbty92796NVq1awdTUFJ6enli6dGmZceWdAgsODkadOnVw7do19O7dG3Xq1IGbmxvef/99qFSqMtvfvHkTr7/+OhQKBaysrDB06FDExMRAEARERERUye/o3Llz6N+/P6ytrWFiYoIWLVrgt99+KzNGrVbjm2++QdOmTWFqagorKyv4+Pjg559/1ozJyMjA2LFj4ebmBrlcDnt7ewQGBmL//v1VkpNIn/AIEBFVWmpqKoYNG4YPP/wQM2bMgEz24N9WV69eRe/evTFlyhSYm5vj0qVLmDVrFqKjox87jVaeuLg4vP/++/j444/h6OiIxYsXY8yYMWjUqBE6der01G2Li4vx6quvYsyYMXj//fdx+PBhfP3117C0tMTnn38OAMjLy0PXrl1x7949zJo1C40aNcLu3bsxePDgyv9SHrp8+TICAgLg4OCAOXPmwNbWFitXrkRwcDBu376NDz/8EADw3XffYfr06Zg2bRo6deqE4uJiXLp0CZmZmZp9DR8+HKdPn8a3336LJk2aIDMzE6dPn8bdu3erLC+R3hCJiCpo5MiRorm5eZl1nTt3FgGIf/7551O3VavVYnFxsRgZGSkCEOPi4jTvffHFF+K//++oXr16oomJiZiUlKRZV1BQINrY2Ijjxo3TrDt48KAIQDx48GCZnADE9evXl9ln7969xaZNm2pez58/XwQg7tq1q8y4cePGiQDEZcuWPfUz/f2zN2zY8MQxb731liiXy8UbN26UWd+rVy/RzMxMzMzMFEVRFPv27Su2aNHiqT+vTp064pQpU546hogqhqfAiKjSrK2t8fLLLz+2PiEhAUOGDIGTkxMMDAxgZGSEzp07AwAuXrz4zP22aNEC7u7umtcmJiZo0qQJkpKSnrmtIAjo169fmXU+Pj5lto2MjIRCoXjsAuy33377mfuvqAMHDqBbt25wc3Mrsz44OBj5+fmaC83btGmDuLg4jB8/Hnv27EF2dvZj+2rTpg0iIiLwzTff4MSJEyguLq6ynET6hgWIiCrN2dn5sXW5ubno2LEjTp48iW+++QaHDh1CTEwMNm/eDAAoKCh45n5tbW0fWyeXyyu0rZmZGUxMTB7btrCwUPP67t27cHR0fGzb8ta9qLt375b7+3FxcdG8DwBhYWH4/vvvceLECfTq1Qu2trbo1q0bYmNjNdusW7cOI0eOxOLFi9G+fXvY2NhgxIgRSEtLq7K8RPqCBYiIKq28Z/gcOHAAKSkpWLp0Kd555x106tQJfn5+UCgUEiQsn62tLW7fvv3Y+qosFLa2tkhNTX1sfUpKCgDAzs4OAGBoaIipU6fi9OnTuHfvHtasWYPk5GT06NED+fn5mrGzZ89GYmIikpKSMHPmTGzevBnBwcFVlpdIX7AAEVG1+LsUyeXyMusXLlwoRZxyde7cGTk5Odi1a1eZ9WvXrq2yn9GtWzdNGXzU8uXLYWZmVu4t/FZWVnj99dcRGhqKe/fuITEx8bEx7u7umDBhArp3747Tp09XWV4ifcG7wIioWgQEBMDa2hohISH44osvYGRkhFWrViEuLk7qaBojR47ETz/9hGHDhuGbb75Bo0aNsGvXLuzZswcANHezPcuJEyfKXd+5c2d88cUX2L59O7p27YrPP/8cNjY2WLVqFXbs2IHvvvsOlpaWAIB+/frB29sbfn5+sLe3R1JSEmbPno169eqhcePGyMrKQteuXTFkyBB4enpCoVAgJiYGu3fvxsCBA6vmF0KkR1iAiKha2NraYseOHXj//fcxbNgwmJubo3///li3bh1atWoldTwAgLm5OQ4cOIApU6bgww8/hCAICAoKwi+//ILevXvDysqqQvv54Ycfyl1/8OBBdOnSBcePH8cnn3yC0NBQFBQUoFmzZli2bFmZU1ddu3bFpk2bsHjxYmRnZ8PJyQndu3fHZ599BiMjI5iYmKBt27ZYsWIFEhMTUVxcDHd3d3z00UeaW+mJqOIEURRFqUMQEWmTGTNmYNq0abhx48YLP6GaiLQbjwARkV6bN28eAMDT0xPFxcU4cOAA5syZg2HDhrH8ENViLEBEpNfMzMzw008/ITExESqVSnNaadq0aVJHI6JqxFNgREREpHd4GzwRERHpHRYgIiIi0jssQERERKR3eBF0OdRqNVJSUqBQKMp9xD8RERFpH1EUkZOTAxcXl2c+yJQFqBwpKSmPzdxMREREuiE5OfmZj7FgASrH35M1Jicnw8LCQuI0REREVBHZ2dlwc3Or0KTLLEDl+Pu0l4WFBQsQERGRjqnI5Su8CJqIiIj0DgsQERER6R0WICIiItI7LEBERESkd1iAiIiISO+wABEREZHeYQEiIiIivcMCRERERHqHBYiIiIj0DgsQERER6R0WICIiItI7LEBERESkd1iAatixa3eQX1QidQwiIiK9xgJUg87dysKoZTHoP+8YrtzOkToOERGR3mIBqkGFxaWwMjPC1fRcvDrvKNbHJEMURaljERER6R0WoBrkV98GOyd3RMfGdigsVuPDTfF4b50SeSqeEiMiIqpJLEA1zK6OHL+NaoMPezaFgUzAVmUK+s09igsp2VJHIyIi0hssQBKQyQSM79IIa8e2g7OlCRLu5GHAL8ew6mQST4kRERHVABYgCfnXt8GOSR3xsqcDikrU+HTLOUxYcwY5hcVSRyMiIqrVWIAkZmNujMUj/PBp72YwlAnYEZ+KvnOP4uzNLKmjERER1VosQFpAJhPwn04NsD6kPepamSLpbj4GhR9HxLHrPCVGRERUDViAtEgrd2vsnNQRQV6OKCpVY/ofFxCy8hSy8nlKjIiIqCqxAGkZSzMjLBzeGl/084KRgYA952+jz9wjUCZnSh2NiIio1mAB0kKCIGBUoAc2vRsAdxsz3LxfgNfDj2PxkQSeEiMiIqoCLEBazMfVCtsndUDvl5xQohbxzY6LeOe3WNzPK5I6GhERkU5jAdJyFiZGmD+kFb4e4A1jQxn+vJSOPnOO4FTSPamjERER6SwWIB0gCAKGt6uHLeMD4GFnjpSsQry58ATCD/0FtZqnxIiIiJ4XC5AOae5iiT8mdkD/Fi4oVYuYtfsSRkXE4G6uSupoREREOoUFSMfUkRti9uAWmDXoJcgNZYi8koHec47gZMJdqaMRERHpDBYgHSQIAgb7u2PbhA5oaG+O29kqvP3rCcz98ypKeUqMiIjomViAdFhTJwX+mNgBg1q5Qi0CP+y7ghFLTyI9p1DqaERERFqNBUjHmRkb4oc3ffH9G74wNTLAsWt30fvnozh27Y7U0YiIiLQWC1At8XprV/wxMRBNHRW4k6vCsCUn8eO+KzwlRkREVA4WoFqkkYMCW0MD8Za/G0QRmPPnVQz59QRuZ/OUGBER0aNYgGoZU2MD/N8gH/z8VguYGxvg5PV76PXzERy6nC51NCIiIq3BAlRL9W9RF39M7IBmzha4l1eE4GUxmLX7EkpK1VJHIyIikhwLUC3WwL4OtowPwPB29QAA4Yf+wluLTiAls0DiZERERNJiAarlTIwM8PUAb8wf0goKuSFik+6j95wj+PPibamjERERSYYFSE/08XHGjkkd4eNqicz8Yoz5LRbfbL+AohKeEiMiIv3DAqRH3G3NsCGkPUYF1gcALD56HW8ujELyvXxpgxEREdUwFiA9Izc0wBf9mmPh8NawMDGEMjkTfeYcwe5zaVJHIyIiqjEsQHqqR3Mn7JzcES3drZBdWIKQlacwfdt5qEpKpY5GRERU7ViA9JirtRnWj2uPsZ0aAAAijifi9fAoJN3NkzgZERFR9WIB0nNGBjJ80rsZlgb7wdrMCGdvZaHPnKPYHp8idTQiIqJqI2kBmjlzJvz9/aFQKODg4IABAwbg8uXLT90mNTUVQ4YMQdOmTSGTyTBlypTHxkREREAQhMeWwkJOCfEkL3s6YufkjvCvb41cVQkmrD6DT7ecRWExT4kREVHtI2kBioyMRGhoKE6cOIF9+/ahpKQEQUFByMt78ikYlUoFe3t7fPrpp/D19X3iOAsLC6SmppZZTExMquNj1BrOlqZY8592GN+lIQBg1ckbeO2X40jIyJU4GRERUdUSRFHUmunCMzIy4ODggMjISHTq1OmZ47t06YIWLVpg9uzZZdZHRERgypQpyMzMfKEc2dnZsLS0RFZWFiwsLF5oH7ou8koGpq5T4m5eEcyMDTDjtZcwoGVdqWMRERE90fN8f2vVNUBZWVkAABsbm0rvKzc3F/Xq1YOrqyv69u2LM2fOVHqf+qRzE3vsnNwR7RrYIL+oFFPWKfHRxngUFPGUGBER6T6tKUCiKGLq1Kno0KEDvL29K7UvT09PREREYNu2bVizZg1MTEwQGBiIq1evljtepVIhOzu7zEKAo4UJVr3TDpO7NYYgAOtik9F//lFcvZ0jdTQiIqJK0ZoCNGHCBMTHx2PNmjWV3le7du0wbNgw+Pr6omPHjli/fj2aNGmCuXPnljt+5syZsLS01Cxubm6VzlBbGMgEvNe9CVaNaQt7hRxXbufi1XnHsCE2WepoREREL0wrCtDEiROxbds2HDx4EK6urlW+f5lMBn9//yceAQoLC0NWVpZmSU7ml/u/BTSyw85JHdGhkR0Kikvx343x+O+GOM4lRkREOknSAiSKIiZMmIDNmzfjwIED8PDwqLafo1Qq4ezsXO77crkcFhYWZRZ6nL1CjuWj2+CDoCaQCcCGUzfxzvJY5KlKpI5GRET0XCQtQKGhoVi5ciVWr14NhUKBtLQ0pKWloaCgQDMmLCwMI0aMKLOdUqmEUqlEbm4uMjIyoFQqceHCBc37X375Jfbs2YOEhAQolUqMGTMGSqUSISEhNfbZaiuZTMCElxtjSbA/TI0McPhKBob8egJ3c1VSRyMiIqowSW+DFwSh3PXLli1DcHAwACA4OBiJiYk4dOjQU7erV68eEhMTAQDvvfceNm/ejLS0NFhaWqJly5aYPn062rdvX6FcvA2+Ys7cuI/RETG4n18MDztzLB/dBm42ZlLHIiIiPfU8399a9RwgbcECVHF/ZeRixJJo3MosgL1Cjt9GtYGXC39nRERU83T2OUCkexra18Hm8QHwdFIgI0eFwQujEPXXXaljERERPRULEFWao4UJ1o1rjzYeNshRlWDk0mjsPJsqdSwiIqInYgGiKmFpaoTlo9ugZ3MnFJWqEbr6NFZEJUodi4iIqFwsQFRlTIwMMH9oKwxr5w5RBD77/Tx+2HsZvMyMiIi0DQsQVSkDmYCv+3tjavcmAIC5B64hbPNZlJTygYlERKQ9WICoygmCgEndGmPGay9BJgBrY5IRsvI0J1IlIiKtwQJE1WZIW3eED2sNuaEM+y/exvAlJ5GZXyR1LCIiIhYgql49mjth5TttYWFiiNik+3hjQRRSMguevSEREVE1YgGiaudf3wYbQgLgZGGCq+m5GBR+HFdv50gdi4iI9BgLENWIpk4KbBofgIb25kjNKsTrC6JwKume1LGIiEhPsQBRjalrZYqNIQFo6W6FrIJiDPn1JPZfuC11LCIi0kMsQFSjrM2NsfqddnjZ0wGqEjXGrTyF9THJUsciIiI9wwJENc7U2AALh7fGG61dUaoW8eGmeMw7cJUPTCQiohrDAkSSMDKQ4bvXfTC+S0MAwPd7r2D6tvMoVbMEERFR9WMBIskIgoAPe3rii35eEATgt6gkTFpzBqoSPjCRiIiqFwsQSW5UoAfmvNUSRgYCdpxNRfDSGGQXFksdi4iIajEWINIK/XxdEDGqDerIDRGVcBdvLTyB9JxCqWMREVEtxQJEWiOwkR3Wjm0HuzpyXEjNxqDw47h+J0/qWEREVAuxAJFW8a5ric3vBqCerRmS7xXg9fDjiL+ZKXUsIiKqZViASOu425phY0gAvOta4G5eEd5adAKHr2RIHYuIiGoRFiDSSvYKOdaObY8OjeyQX1SK0REx2HrmltSxiIiolmABIq1VR26IpcH+eNXXBSVqEVPWKbH4SILUsYiIqBZgASKtZmwow+zBLTA60AMA8M2Oi5ix8yLUfGAiERFVAgsQaT2ZTMBnfZvh416eAIBFhxPw/oY4FJeqJU5GRES6igWIdIIgCAjp3BA/vOELA5mALWduYcxvschTlUgdjYiIdBALEOmUQa1dsXikH0yNDHD4SgaG/HoCd3NVUsciIiIdwwJEOqdrUwes/k9bWJsZIe5mFl5fEIXke/lSxyIiIh3CAkQ6qaW7NTa+G4C6Vqa4ficPA8OP40JKttSxiIhIR7AAkc5qaF8Hm8cHwNNJgYwcFQYvjELUX3eljkVERDqABYh0mqOFCdaNa482HjbIUZVg5NJo7DybKnUsIiLScixApPMsTY2wfHQb9GzuhKJSNUJXn8aKqESpYxERkRZjAaJawcTIAPOHtsLQtu4QReCz38/jx72XIYp8YCIRET2OBYhqDQOZgG8GeOO9V5oAAOYcuIZPtpxFCR+YSERE/8ICRLWKIAiY/EpjfPuaN2QCsCY6GSErT6OwuFTqaEREpEVYgKhWGtq2HsKHtYaxoQz7L97GsMUnkZlfJHUsIiLSEixAVGv1aO6ElWPawsLEELFJ9/HGgiikZhVIHYuIiLQACxDVam08bLAhJACOFnJcTc/FoF+O41p6jtSxiIhIYixAVOs1dVJg07sBaGBvjpSsQgwKj8KppHtSxyIiIgmxAJFecLU2w6aQALR0t0JWQTGGLj6J/RduSx2LiIgkwgJEesPa3Bir3mmLlz0dUFisxriVp7A+JlnqWEREJAEWINIrZsaGWDi8NV5v7YpStYgPN8Vj/sFrUsciIqIaxgJEesfIQIb/ve6D8V0aAgD+t+cylhy9LnEqIiKqSSxApJcEQcCHPT3xQdCDp0Z/vf0Ctpy5KXEqIiKqKZIWoJkzZ8Lf3x8KhQIODg4YMGAALl++/NRtUlNTMWTIEDRt2hQymQxTpkwpd9ymTZvg5eUFuVwOLy8vbNmypRo+Aem60K6NMDrQAwDw3w3xOHgpXeJERERUEyQtQJGRkQgNDcWJEyewb98+lJSUICgoCHl5eU/cRqVSwd7eHp9++il8fX3LHRMVFYXBgwdj+PDhiIuLw/Dhw/Hmm2/i5MmT1fVRSEcJgoBpfZphQAsXlKhFvLvqFE4l3Zc6FhERVTNB1KLpsjMyMuDg4IDIyEh06tTpmeO7dOmCFi1aYPbs2WXWDx48GNnZ2di1a5dmXc+ePWFtbY01a9Y8c7/Z2dmwtLREVlYWLCwsnvtzkO4pLlXjP8tjcehyBixNjbAhpD2aOCqkjkVERM/heb6/teoaoKysLACAjY1NpfYTFRWFoKCgMut69OiB48ePV2q/VHsZGcjwy9BWaPXwOUEjlkTj5v18qWMREVE10ZoCJIoipk6dig4dOsDb27tS+0pLS4Ojo2OZdY6OjkhLSyt3vEqlQnZ2dpmF9I+ZsSGWBvujsUMdpGUXYsSSaNzNVUkdi4iIqoHWFKAJEyYgPj6+QqeoKkIQhDKvRVF8bN3fZs6cCUtLS83i5uZWJRlI91iZGWP5mDaoa2WKhDt5GBURg1xVidSxiIioimlFAZo4cSK2bduGgwcPwtXVtdL7c3JyeuxoT3p6+mNHhf4WFhaGrKwszZKczKcD6zNnS1MsH9MGNubGiL+ZhXErYqEqKZU6FhERVSFJC5AoipgwYQI2b96MAwcOwMPDo0r22759e+zbt6/Mur179yIgIKDc8XK5HBYWFmUW0m8N7esgYpQ/zI0NcOzaXby3TolStdbcL0BERJUkaQEKDQ3FypUrsXr1aigUCqSlpSEtLQ0FBQWaMWFhYRgxYkSZ7ZRKJZRKJXJzc5GRkQGlUokLFy5o3p88eTL27t2LWbNm4dKlS5g1axb279//xGcGEZXHx9UKC4f7wchAwM6zafj893PQopsmiYioEiS9Df5J1+QsW7YMwcHBAIDg4GAkJibi0KFDT92uXr16SExM1LzeuHEjpk2bhoSEBDRs2BDffvstBg4cWKFcvA2eHrUjPhUT1pyGKAKTuzXGe92bSB2JiIjK8Tzf31r1HCBtwQJE/7biRBI+23oOAPDlq80xMqC+tIGIiOgxOvscICJtNbxdPbz3yoMjP9P/OI9tcSkSJyIiospgASKqoEndGmFE+3oQReD99UocvpIhdSQiInpBLEBEFSQIAqb3a46+Ps4oLhURsvIUlMmZUsciIqIXwAJE9BxkMgE/vtkCHRvbIb+oFKOWReNaeo7UsYiI6DmxABE9J2NDGRYMaw1fNyvcz38wb1hKZsGzNyQiIq3BAkT0AszlhlgW7I8G9uZIySrEiKXRuJ9XJHUsIiKqIBYgohdkY26MFWPawtnSBNfSczEqIgb5RZw3jIhIF7AAEVVCXStTLB/dBlZmRlAmZyJk5WkUlailjkVERM/AAkRUSY0dFVga7A9TIwMcvpKBDzbEQc15w4iItBoLEFEVaOVujfBhrWAoE7AtLgVfbb/AecOIiLQYCxBRFenS1AE/vOkLAIg4noh5B65JnIiIiJ6EBYioCvVvURdf9PMCAPyw7wpWnUySOBEREZWHBYioio0K9MDElxsBAKZtPYedZ1MlTkRERP/GAkRUDaZ2b4Ihbd0hisCUtUocv3ZH6khERPQIFiCiaiAIAr7u741e3k4oKlXjP8tjcfZmltSxiIjoIRYgompiIBMw+60WCGhoi7yiUgQvi0ZCRq7UsYiICCxARNVKbmiAhcNbw7uuBe7mFWH4kmjczi6UOhYRkd5jASKqZgoTI0SMagMPO3PcyizAiCXRyMovljoWEZFeYwEiqgF2deRYProNHBRyXL6dgzG/xaCgqFTqWEREeosFiKiGuNmYYfmYNrAwMURs0n2Erj6N4lLOG0ZEJAUWIKIa5OlkgaXB/pAbynDgUjo+2hjPecOIiCTAAkRUw/zq2yB8WCsYyARsPnMLM3Ze5LxhREQ1jAWISAIvezriu0E+AIDFR69jQWSCxImIiPQLCxCRRAa1dsW0Ps0AALN2X8K6mBsSJyIi0h8sQEQSeqdjA4R0bggACNt8FnvOp0mciIhIP7AAEUnso55N8aafK9QiMHHNGZxIuCt1JCKiWo8FiEhigiBgxmsvobuXI4pK1PjPb7E4n8J5w4iIqhMLEJEWMDSQYe7bLdHGwwY5qhKMXBqDpLt5UsciIqq1WICItISJkQEWj/RDM2cL3MlVYfiSaKTncN4wIqLqwAJEpEUsTIzw22h/uNuY4ca9fIxcGoOsAs4bRkRU1ViAiLSMg8IEK8a0gV0dOS6mZuM/y2NRWMx5w4iIqhILEJEWqmdrjt9G+0MhN0T09XuYuOYMSjhvGBFRlWEBItJSzV0s8etIPxgbyrDvwm18suUsp8wgIqoiLEBEWqxdA1vMe7slZAKwPvYmZu2+LHUkIqJagQWISMsFNXfC/w18MG/Ygsi/8OthzhtGRFRZLEBEOuBNfzd81NMTAPDtzovYdOqmxImIiHQbCxCRjgjp3ADvdPAAAHy4KR5/XrwtcSIiIt3FAkSkIwRBwCe9m2Fgq7ooVYsYv+o0YhLvSR2LiEgnsQAR6RCZTMCsQT542dMBqhI1xkTE4FJattSxiIh0DgsQkY4xMpBh/pBWaF3PGtmFJRixJBrJ9/KljkVEpFNYgIh0kKmxAZaO9EdTRwXSc1QYvuQk7uSqpI5FRKQzWICIdJSlmRGWj2mDulamSLybj+Bl0chVlUgdi4hIJ7AAEekwRwsTrHynLWzNjXHuVjYmrj7NKTOIiCqABYhIx3nYmWPxSD/IDWU4eDkDX22/wCkziIieQdICNHPmTPj7+0OhUMDBwQEDBgzA5cvPftR/ZGQkWrduDRMTEzRo0AALFiwo835ERAQEQXhsKSwsrK6PQiSplu7WmD24BQQBWB6VhKXHEqWORESk1SQtQJGRkQgNDcWJEyewb98+lJSUICgoCHl5eU/c5vr16+jduzc6duyIM2fO4JNPPsGkSZOwadOmMuMsLCyQmppaZjExManuj0QkmV4vOSOs14OnRX+z4wL2nk+TOBERkfYylPKH7969u8zrZcuWwcHBAadOnUKnTp3K3WbBggVwd3fH7NmzAQDNmjVDbGwsvv/+ewwaNEgzThAEODk5VVt2Im30n44NkHQ3H6tO3sDktUqsG9cOPq5WUsciItI6WnUNUFZWFgDAxsbmiWOioqIQFBRUZl2PHj0QGxuL4uJizbrc3FzUq1cPrq6u6Nu3L86cOfPEfapUKmRnZ5dZiHSRIAj48tXm6NzEHgXFpRjzWyxu3uczgoiI/k1rCpAoipg6dSo6dOgAb2/vJ45LS0uDo6NjmXWOjo4oKSnBnTt3AACenp6IiIjAtm3bsGbNGpiYmCAwMBBXr14td58zZ86EpaWlZnFzc6u6D0ZUwwwNZJg3pCU8nRTIyFFhTEQssguLn70hEZEe0ZoCNGHCBMTHx2PNmjXPHCsIQpnXf9/x8vf6du3aYdiwYfD19UXHjh2xfv16NGnSBHPnzi13f2FhYcjKytIsycnJlfw0RNJSmBhhabA/HBRyXL6dg9BVp1HM2+OJiDS0ogBNnDgR27Ztw8GDB+Hq6vrUsU5OTkhLK3txZ3p6OgwNDWFra1vuNjKZDP7+/k88AiSXy2FhYVFmIdJ1LlamWBrsD1MjAxy5egefbT3H2+OJiB6StACJoogJEyZg8+bNOHDgADw8PJ65Tfv27bFv374y6/bu3Qs/Pz8YGRk98ecolUo4OztXSW4iXeFd1xJz324JmQCsjUnGwsMJUkciItIKkhag0NBQrFy5EqtXr4ZCoUBaWhrS0tJQUFCgGRMWFoYRI0ZoXoeEhCApKQlTp07FxYsXsXTpUixZsgQffPCBZsyXX36JPXv2ICEhAUqlEmPGjIFSqURISEiNfj4ibfCKlyM+7+sFAPi/XZewIz5V4kRERNKTtACFh4cjKysLXbp0gbOzs2ZZt26dZkxqaipu3Lihee3h4YGdO3fi0KFDaNGiBb7++mvMmTOnzC3wmZmZGDt2LJo1a4agoCDcunULhw8fRps2bWr08xFpi+BADwQH1AcAvLdeiVNJ96UNREQkMUHkRQGPyc7OhqWlJbKysng9ENUapWoR41bEYv/FdNiaG2PL+EC425pJHYuIqMo8z/e3VlwETUTVz0Am4Oe3WsK7rgXu5hUhOCIaWfm8PZ6I9BMLEJEeMZcbYslIf7hYmiAhIw/jVsaiqIS3xxOR/mEBItIzjhYmWBLsjzpyQ5xIuIePN8fz9ngi0jssQER6qJmzBeYPbQUDmYDNp29h7oFrUkciIqpRLEBEeqpzE3t81b85AODHfVew9cwtiRMREdUcFiAiPTa0bT2M69QAAPDhxnhEX78ncSIioprxQgUoOTkZN2/e1LyOjo7GlClTsGjRoioLRkQ146Oenujl7YSiUjXGrohFQkau1JGIiKrdCxWgIUOG4ODBgwAezM7evXt3REdH45NPPsFXX31VpQGJqHrJZAJ+GtwCLdyskJlfjNERMbiXVyR1LCKiavVCBejcuXOapyqvX78e3t7eOH78OFavXo2IiIiqzEdENcDEyAC/jvCDq7UpEu/mY+zyWBQWl0odi4io2rxQASouLoZcLgcA7N+/H6+++ioAwNPTE6mpnGeISBfZK+RYFuwPhYkhYpPu478b46FW8/Z4IqqdXqgANW/eHAsWLMCRI0ewb98+9OzZEwCQkpICW1vbKg1IRDWnsaMCC4e1hqFMwB9xKfhx3xWpIxERVYsXKkCzZs3CwoUL0aVLF7z99tvw9fUFAGzbto0TjhLpuIBGdpgx8CUAwLyD17A+NlniREREVe+FJ0MtLS1FdnY2rK2tNesSExNhZmYGBweHKgsoBU6GSgR8v+cy5h28BkOZgOWj2yCgkZ3UkYiInqraJ0MtKCiASqXSlJ+kpCTMnj0bly9f1vnyQ0QPvB/UBK/6uqBELWLcylO4ejtH6khERFXmhQpQ//79sXz5cgBAZmYm2rZtix9++AEDBgxAeHh4lQYkImkIgoDvXveBXz1r5BSWYFREDDJyVFLHIiKqEi9UgE6fPo2OHTsCADZu3AhHR0ckJSVh+fLlmDNnTpUGJCLpmBgZYNEIP9S3NcPN+wV4Z3ksCop4ezwR6b4XKkD5+flQKBQAgL1792LgwIGQyWRo164dkpKSqjQgEUnLxtwYy0a1gZWZEeKSM/HeOiVvjycinfdCBahRo0bYunUrkpOTsWfPHgQFBQEA0tPTedEwUS3kYWeORcP9YGwgw+7zaZi1+5LUkYiIKuWFCtDnn3+ODz74APXr10ebNm3Qvn17AA+OBrVs2bJKAxKRdmjjYYP/veEDAFh4OAGrTvJoLxHprhe+DT4tLQ2pqanw9fWFTPagR0VHR8PCwgKenp5VGrKm8TZ4oieb8+dV/LjvCgxkApaM9EOXprzzk4i0w/N8f79wAfrbzZs3IQgC6tatW5ndaBUWIKInE0URH2yIx6bTN1FHbogNIe3RzJn/OyEi6VX7c4DUajW++uorWFpaol69enB3d4eVlRW+/vprqNXqFwpNRLpBEATMHPgS2jWwQa6qBKMjYnA7u1DqWEREz+WFCtCnn36KefPm4f/+7/9w5swZnD59GjNmzMDcuXPx2WefVXVGItIyxoYyLBzmhwb25kjNKsToiBjkqUqkjkVEVGEvdArMxcUFCxYs0MwC/7fff/8d48ePx61bt6osoBR4CoyoYm7czcdrvxzD3bwivNLMAQuH+8FAJkgdi4j0VLWfArt37165Fzp7enri3r17L7JLItJB7rZm+HWkH+SGMuy/mI6vt1+QOhIRUYW8UAHy9fXFvHnzHls/b948+Pj4VDoUEemOVu7W+PHNFgCAiOOJWHbsurSBiIgqwPBFNvruu+/Qp08f7N+/H+3bt4cgCDh+/DiSk5Oxc+fOqs5IRFquj48zku974v92XcLX2y/AzdoMr3g5Sh2LiOiJXugIUOfOnXHlyhW89tpryMzMxL179zBw4ECcP38ey5Ytq+qMRKQDxnVqgLfbuEEtAhPXnMHZm1lSRyIieqJKPwfoUXFxcWjVqhVKS3V7skReBE30YopL1RgdEYMjV+/AQSHH1tBAuFiZSh2LiPREtV8ETURUHiMDGeYPbYWmjgqk56gwOiIGOYXFUsciInoMCxARVSkLEyMsHeUPe4Ucl9JyELr6DEpK+YBUItIuLEBEVOXqWpliyUg/mBoZ4PCVDHy+7Tyq8Gw7EVGlPdddYAMHDnzq+5mZmZXJQkS1iI+rFX5+qwXGrTyF1SdvoL6tGcZ2aih1LCIiAM9ZgCwtLZ/5/ogRIyoViIhqj6DmTpjWxwtfb7+AGTsvwc3aDL1ecpY6FhHR8xUg3uJORM9rdGB93Libh9+ikjBlnRJOliZo6W4tdSwi0nO8BoiIqpUgCPisrxde9nSAqkSN/yyPRfK9fKljEZGeYwEiompnaCDD3LdbwsvZAndyizAqIgZZBbw9noikwwJERDXCXG6IpcH+cLIwwbX0XLy78hSKSnh7PBFJgwWIiGqMk6UJlgb7w9zYAMf/uotPt5zl7fFEJAkWICKqUV4uFpg3pBVkArDh1E38cugvqSMRkR5iASKiGtfV0wFf9vcGAPxvz2X8rrwlcSIi0jcsQEQkieHt6uGdDh4AgP9uiEdM4j2JExGRPmEBIiLJfNK7GXo0d0RRqRpjl8ci8U6e1JGISE9IWoBmzpwJf39/KBQKODg4YMCAAbh8+fIzt4uMjETr1q1hYmKCBg0aYMGCBY+N2bRpE7y8vCCXy+Hl5YUtW7ZUx0cgokqQyQTMHtwSvq6WuJ9fjFERMbifVyR1LCLSA5IWoMjISISGhuLEiRPYt28fSkpKEBQUhLy8J/8r8Pr16+jduzc6duyIM2fO4JNPPsGkSZOwadMmzZioqCgMHjwYw4cPR1xcHIYPH44333wTJ0+erImPRUTPwdTYAL+O9ENdK1Ncv5OHcStOobC4VOpYRFTLCaIW3YOakZEBBwcHREZGolOnTuWO+eijj7Bt2zZcvHhRsy4kJARxcXGIiooCAAwePBjZ2dnYtWuXZkzPnj1hbW2NNWvWPDNHdnY2LC0tkZWVBQsLi0p+KiKqiCu3czDol+PIUZWgUxN7LBreGiZGBlLHIiId8jzf31p1DVBWVhYAwMbG5oljoqKiEBQUVGZdjx49EBsbi+Li4qeOOX78eLn7VKlUyM7OLrMQUc1q4qjA4pF+MDUywOErGRjLI0FEVI20pgCJooipU6eiQ4cO8Pb2fuK4tLQ0ODo6llnn6OiIkpIS3Llz56lj0tLSyt3nzJkzYWlpqVnc3Nwq+WmI6EW0bWCLZaP8NSWIp8OIqLpoTQGaMGEC4uPjK3SKShCEMq//Pov36Pryxvx73d/CwsKQlZWlWZKTk583PhFVkXYNbLE0+EEJirySgZCVLEFEVPW0ogBNnDgR27Ztw8GDB+Hq6vrUsU5OTo8dyUlPT4ehoSFsbW2fOubfR4X+JpfLYWFhUWYhIum0b/igBJkYyXDocgbeZQkioiomaQESRRETJkzA5s2bceDAAXh4eDxzm/bt22Pfvn1l1u3duxd+fn4wMjJ66piAgICqC09E1ap9Q1ssC24DEyMZDj4sQaoSliAiqhqSFqDQ0FCsXLkSq1evhkKhQFpaGtLS0lBQUKAZExYWhhEjRmheh4SEICkpCVOnTsXFixexdOlSLFmyBB988IFmzOTJk7F3717MmjULly5dwqxZs7B//35MmTKlJj8eEVXSo0eCDl7OQMgKliAiqhqS3gb/pGtyli1bhuDgYABAcHAwEhMTcejQIc37kZGReO+993D+/Hm4uLjgo48+QkhISJl9bNy4EdOmTUNCQgIaNmyIb7/9FgMHDqxQLt4GT6Rdjl+7g9G/xaCwWI2XPR0QPqwV5Ia8RZ6Iynqe72+teg6QtmABItI+LEFE9Cw6+xwgIqInCWhkhyUj/SE3lOHApXSMX3map8OI6IWxABGRzghsZIelwQ9K0J+X0hG6iiWIiF4MCxAR6ZTAR44E7b/4oAQVlailjkVEOoYFiIh0TofGZUvQ+FWnWIKI6LmwABGRTurQ2A6LR/o9UoJ4JIiIKo4FiIh0VsfG9vh1xN8l6DZCV7MEEVHFsAARkU7r1ORBCTI2lGHfBZYgIqoYFiAi0nmdmthj8SMlaAJLEBE9AwsQEdUKjx4J2nvhNiauOY3iUpYgIiofCxAR1Rqdm9hj0fDWMDaUYc/5B0eCWIKIqDwsQERUq3Rp6sASRETPxAJERLWOpgQZPChBE1efYQkiojJYgIioVurS1AELRzwoQbvPp2HSGpYgIvoHCxAR1VpdHylBu86xBBHRP1iAiKhW69rUAQuH/1OCJq9lCSIiFiAi0gNdPR2wYHgrGBvIsPNsGqasVbIEEek5FiAi0gsvezoifNiDErTjbCqmrFWihCWISG+xABGR3ujW7EEJMjIQsONsKiazBBHpLRYgItIr3Zo5YsGw1v+UoHUsQUT6iAWIiPROt2aOCB/6sATFp2IKSxCR3mEBIiK99IrXPyVoe3wq3lsfxxJEpEdYgIhIb73i5YhfHpagP+JSWIKI9AgLEBHpte5ejpg/pJWmBE1lCSLSCyxARKT3gpo7Yf6QVjCUCdgWl4L3N7AEEdV2LEBERHhQgn4Z+qAE/a5kCSKq7ViAiIgeCmruhPn/KkGlalHqWERUDViAiIge0aO5E+YNeaQErVeyBBHVQixARET/0tP7nxK0VZmCD3gkiKjWYQEiIirHgxLUEoYyAVvO3GIJIqplWICIiJ6gp7cz5r7dEgYPS9B/WYKIag0WICKip+j1kjPmPSxBm8/cwn83sgQR1QYsQEREz1CmBJ1mCSKqDViAiIgqoNdL/5wO23z6Fj7cGM8SRKTDDKUOQESkK3q/5AxRBCatPYNNp29CEIBZg3xgIBOkjkZEz4kFiIjoOfTxcQbwoARtPHUTAh6UIBlLEJFOYQEiInpOfXycIULE5LVKbDh1EwBLEJGuYQEiInoBfX1cIIrAlHUsQUS6iBdBExG9oH6+Lpg9uAVkArDh1E18vDkeal4YTaQTeASIiKgS+vm6AAAmrz2D9bEPjgT930AeCSLSdjwCRERUSf18XTD7rZaQCcD62JsI23yWR4KItBwLEBFRFXjV1wU/PTwdti42GZ9sOcvnBBFpMRYgIqIq0r9FXU0JWhuTjGGLTyItq1DqWERUDhYgIqIq1L9FXcx9uxXMjA0QlXAXPX8+jD3n06SORUT/ImkBOnz4MPr16wcXFxcIgoCtW7c+c5v58+ejWbNmMDU1RdOmTbF8+fIy70dEREAQhMeWwkL+K4yIakYfH2dsn9gBL9W1RGZ+McatOIVPtpxFQVGp1NGI6CFJC1BeXh58fX0xb968Co0PDw9HWFgYpk+fjvPnz+PLL79EaGgo/vjjjzLjLCwskJqaWmYxMTGpjo9ARFSuBvZ1sOndAIzr1AAAsPrkDfSbdxQXUrIlTkZEgMS3wffq1Qu9evWq8PgVK1Zg3LhxGDx4MACgQYMGOHHiBGbNmoV+/fppxgmCACcnpyrPS0T0PIwNZQjr3QwdG9tj6nolrqXnYsD8Y/i4lydGBdaHIPBWeSKp6NQ1QCqV6rEjOaampoiOjkZxcbFmXW5uLurVqwdXV1f07dsXZ86ceeZ+s7OzyyxERFWlQ2M77JrcEa80c0BRqRpfbb+AURExuJOrkjoakd7SqQLUo0cPLF68GKdOnYIoioiNjcXSpUtRXFyMO3fuAAA8PT0RERGBbdu2Yc2aNTAxMUFgYCCuXr36xP3OnDkTlpaWmsXNza2mPhIR6QnbOnL8OsIPX/dvDrmhDIcuZ6Dn7COIvJIhdTQivSSIoqgVD6oQBAFbtmzBgAEDnjimoKAAoaGhWLFiBURRhKOjI4YNG4bvvvsOt2/fhoODw2PbqNVqtGrVCp06dcKcOXPK3a9KpYJK9c+/xLKzs+Hm5oasrCxYWFhU+rMRET3qcloOJq05g8u3cwAA73TwwH97NoXc0EDiZES6LTs7G5aWlhX6/tapI0CmpqZYunQp8vPzkZiYiBs3bqB+/fpQKBSws7MrdxuZTAZ/f/+nHgGSy+WwsLAosxARVZemTgr8PiEQI9vXAwAsPnodr80/jmvpuRInI9IfOlWA/mZkZARXV1cYGBhg7dq16Nu3L2Sy8j+KKIpQKpVwdnau4ZRERE9mYmSAL/t7Y8lIP9iYG+NCajb6zj2CNdE3oCUH5olqNUkLUG5uLpRKJZRKJQDg+vXrUCqVuHHjBgAgLCwMI0aM0Iy/cuUKVq5ciatXryI6OhpvvfUWzp07hxkzZmjGfPnll9izZw8SEhKgVCoxZswYKJVKhISE1OhnIyKqiG7NHLF7ckd0aGSHwmI1wjafxbsrTyMzv0jqaES1mqQFKDY2Fi1btkTLli0BAFOnTkXLli3x+eefAwBSU1M1ZQgASktL8cMPP8DX1xfdu3dHYWEhjh8/jvr162vGZGZmYuzYsWjWrBmCgoJw69YtHD58GG3atKnRz0ZEVFEOFiZYProNPuntCSMDAbvPp6Hn7COI+uuu1NGIai2tuQhamzzPRVRERFXp7M0sTFp7Btfv5EEQgNAujTD5lcYwMtDJKxaIalStvQiaiKi2e8nVEtsndsBgPzeIIjDv4DW8sSAKN+7mSx2NqFZhASIi0jLmckPMet0H84a0hMLEEMrkTPSecwRbztyUOhpRrcECRESkpfr6uGDX5I7wr2+NXFUJ3lsXhylrzyCnsPjZGxPRU7EAERFpMVdrM6z5TztM7d4EBjIBW5Up6D3nCE7fuC91NCKdxgJERKTlDA1kmNStMdaPawdXa1Mk3yvAGwuiMO/AVZSqeR8L0YtgASIi0hGt69lg5+SO6OfrglK1iO/3XsHbv55ASmaB1NGIdA4LEBGRDrEwMcKct1rghzd8YW5sgOjr99Dr5yPYdTZV6mhEOoUFiIhIxwiCgEGtXbFjUkf4uFoiq6AY7646jbDN8cgvKpE6HpFOYAEiItJR9e3MsTEkAO92aQhBANZEJ6Pv3KM4dytL6mhEWo8FiIhIhxkbyvBRT0+sGtMWjhZyJGTkYeAvx7H4SALUvECa6IlYgIiIaoGARnbYNbkTuns5oqhUjW92XERwRAzScwqljkaklViAiIhqCRtzYywa3hrfDPCG3FCGw1cy0Gv2ERy8lC51NCKtwwJERFSLCIKAYe3qYfvEDvB0UuBuXhFGRcRg+rbzKCwulToekdZgASIiqoUaOyqwNTQQwQH1AQARxxMxYP4xXL2dI20wIi3BAkREVEuZGBlg+qvNsTTYD7bmxriUloO+c49i5YkkiCIvkCb9xgJERFTLvezpiF1TOqJjYzuoStSYtvUcxq44hXt5RVJHI5IMCxARkR5wUJjgt1FtMK1PMxgZCNh34TZ6/XwYx6/dkToakSRYgIiI9IRMJuCdjg2wZXwgGtib43a2CkOXnMSs3ZdQXKqWOh5RjWIBIiLSM951LbF9Yge83cYNogiEH/oLr4cfR+KdPKmjEdUYFiAiIj1kZmyImQN9ED60FSxNjRB3Mwt95hzBxlM3eYE06QUWICIiPdbrJWfsmtwRbTxskFdUig82xGHSWiWyCoqljkZUrViAiIj0nIuVKdb8px0+CGoCA5mAP+JS0PvnIziVdE/qaETVhgWIiIhgIBMw4eXG2BDSHm42priVWYA3F57Az/uvoqiEF0hT7cMCREREGq3crbFzUkcMaOGCUrWIn/ZfQZf/HcRvxxM5lQbVKoLIq90ek52dDUtLS2RlZcHCwkLqOEREkthy5iZm7LyEjBwVAMCujhzvdPTA0LbuUJgYSZyO6HHP8/3NAlQOFiAiogcKi0uxITYZCyITcCuzAABgYWKI4EAPjAqoD2tzY4kTEv2DBaiSWICIiMoqLlXjd2UKfjl0DQkZD54XZGZsgGHt6uGdDh5wsDCROCERC1ClsQAREZWvVC1i97k0zDt4DRdTswEAxoYyDPZzw9hODeBmYyZxQtJnLECVxAJERPR0oiji4OV0zDtwDadvZAIADGUC+reoi/FdG6KhfR1pA5JeYgGqJBYgIqKKEUURJxLuYf7Bazj6cGJVQQB6eztjfNeGaO5iKXFC0icsQJXEAkRE9PzO3LiP+Qf/wv6LtzXruja1x4SXG6F1PRsJk5G+YAGqJBYgIqIXdyktG/MP/oUd8SlQP/yGadfABhO6NkZgI1sIgiBtQKq1WIAqiQWIiKjyrt/Jw4JDf2HzmZsoLn3wVePrZoXQLg3xSjNHyGQsQlS1WIAqiQWIiKjqpGQWYNHhBKyJvgHVw2k1mjoqML5rQ/T1cYEBixBVERagSmIBIiKqendyVVhy9DpWRCUhV1UCAKhva4Z3uzTEay1dYWzI2ZmocliAKokFiIio+mTlF+O3qEQsPXYdmfnFAABnSxOM7dQAb/m7w9TYQOKEpKtYgCqJBYiIqPrlqUqw+uQNLDqS8Mh8Y8YY3cEDw9vV43xj9NxYgCqJBYiIqOYUFpdi46mbWBD5F27ef2S+sYD6GBXowfnGqMJYgCqJBYiIqOYVl6qx7eF8Y389Mt/Y0LbueKdjAzhyvjF6BhagSmIBIiKSjlotYvf5NMw/eA3nUx7ON2Ygwxt+rgjp3JDzjdETsQBVEgsQEZH0RFHEoSsZmH/gGmKT7gMADGQC+rdwwfgujdDIgfONUVksQJXEAkREpD1EUcTJ6w/mGzty9Z/5xno2d0Jo10bwrsv5xugBFqBKYgEiItJOccmZmH/wGvZe+Ge+sS5N7TGhayP41ed8Y/rueb6/JX3q1OHDh9GvXz+4uLhAEARs3br1mdvMnz8fzZo1g6mpKZo2bYrly5c/NmbTpk3w8vKCXC6Hl5cXtmzZUg3piYiopvm6WWHRCD/smdIJ/Vu4QCYAhy5n4PUFURi8MApHrmaA/66nipC0AOXl5cHX1xfz5s2r0Pjw8HCEhYVh+vTpOH/+PL788kuEhobijz/+0IyJiorC4MGDMXz4cMTFxWH48OF48803cfLkyer6GEREVMOaOinw81stceD9LnjL3w1GBgJOXr+H4UuiMWD+Mew5nwa1mkWInkxrToEJgoAtW7ZgwIABTxwTEBCAwMBA/O9//9OsmzJlCmJjY3H06FEAwODBg5GdnY1du3ZpxvTs2RPW1tZYs2ZNhbLwFBgRkW5JzfpnvrHC4rLzjfV5yRmGBpxmQx/ozCmw56VSqWBiUvY5EKampoiOjkZx8YPHqUdFRSEoKKjMmB49euD48eNP3W92dnaZhYiIdIezpSm+6NccRz96GeO7NIRCbojLt3Mwea0S3X6MxJroG8gvKpE6JmkRnSpAPXr0wOLFi3Hq1CmIoojY2FgsXboUxcXFuHPnwZ0BaWlpcHR0LLOdo6Mj0tLSnrjfmTNnwtLSUrO4ublV6+cgIqLqYVdHjg97euLoxy/j/e5NYG1mhKS7+QjbfBatv96PCatPY/e5VBQWl0odlSSmUwXos88+Q69evdCuXTsYGRmhf//+CA4OBgAYGPwzeZ4gCGW2E0XxsXWPCgsLQ1ZWlmZJTk6ulvxERFQzLE2NMLFbYxz7+GVM69MMbjamKCguxfb4VISsPI1WX+/DpDVnsOd8GsuQnjKUOsDzMDU1xdKlS7Fw4ULcvn0bzs7OWLRoERQKBezs7AAATk5Ojx3tSU9Pf+yo0KPkcjnkcnm1ZicioppnZmyIdzo2wJgOHjh7Kws74lOxPT4VtzILsC0uBdviUmBubIDuXo7o4+OCjo3tYGLE2ej1gU4VoL8ZGRnB1dUVALB27Vr07dsXMtmDg1nt27fHvn378N5772nG7927FwEBAZJkJSIi6QmCAB9XK/i4WuHjXp6Iu5mFHfEp2BGfipSsQmxVpmCrMgUKueHDMuSMDo3tIDdkGaqtJC1Aubm5uHbtmub19evXoVQqYWNjA3d3d4SFheHWrVuaZ/1cuXIF0dHRaNu2Le7fv48ff/wR586dw2+//abZx+TJk9GpUyfMmjUL/fv3x++//479+/dr7hIjIiL9JggCWrhZoYWbFcJ6NYPyZiZ2xKdiR3wq0rILsfnMLWw+cwsKE0MEeTmhr48zAhvZwdhQp64aoWeQ9Db4Q4cOoWvXro+tHzlyJCIiIhAcHIzExEQcOnQIAHDx4kUMGTIEly9fhpGREbp27YpZs2ahadOmZbbfuHEjpk2bhoSEBDRs2BDffvstBg4cWOFcvA2eiEj/qNUiziTfx/b4VOw8m4rb2SrNexYmhujR3Al9HpYhI95Wr5U4FUYlsQAREek3tVrEqRv3sT0uBTvPpSEj558yZGVmhB5eD8pQ+4a2LENahAWokliAiIjob6VqETGJ97AjPhW7zqXiTm6R5j1rMyP09HZCn5dc0K6BDR+4KDEWoEpiASIiovKUqkWcvH4XO+JTsftcGu7m/VOGbM2NH5QhH2e09bCFgezJj1+h6sECVEksQERE9CwlpWqcvH4P2+NTsftcKu7nF2ves6tjjF7ezujj4wz/+jYsQzWEBaiSWICIiOh5FJeqcSLh4ZGh82nIfKQM2Svk6O3thD4+LvCrZw0Zy1C1YQGqJBYgIiJ6UcWlahy7dgc74lOx53wasgv/mYPM0UKOXt7O6OvjjFbuLENVjQWokliAiIioKhSVPChD2+NTsfdCGnIeKUNOFibo/dKD02Qt3axYhqoAC1AlsQAREVFVU5WU4ujVB0eG9l64jVzVP2XIxfKfMtTCzeqp81fSk7EAVRILEBERVafC4lIcuXoHO+JTsO/CbeQV/TMha10rU/TxcUafl5zh42rJMvQcWIAqiQWIiIhqSmFxKSKvZGBHfCr2X7yN/EfKkJuNKfq85IK+Ps5o7mLBMvQMLECVxAJERERSKCgqxaHL6dh+NhUHLqajoPifMlTP1gy9X3JGN08H+LpZ8QnU5WABqiQWICIiklp+UQkOXsrAjrMpOHApHYXFas175sYGaNfAFoGN7NChsR0aO9Th0SGwAFUaCxAREWmTPFUJDlxKx+5zaTj2150yzxkCHjxrqEMjOwQ2skNgI1s4W5pKlFRaLECVxAJERETaSq0WcSE1G0ev3cGxa3cQff0eVCXqMmMa2ptrClG7hrawMDGSKG3NYgGqJBYgIiLSFYXFpTiddF9TiOJvZeHRb3aZAPi6WWkKUUt3K8gNDaQLXI1YgCqJBYiIiHRVVn4xohLuPCxEd3H9Tl6Z902NDNDGw0ZTiDydFLXmIYwsQJXEAkRERLXFrcwCHHt4dOjYtTu4k1tU5n1bc2MENLJDh0YPLqp2tTaTKGnlsQBVEgsQERHVRqIo4vLtHBy9+qAMnbx+r8xzhwCgvq3Zg7vLGtmhfUNbWJkZS5T2+bEAVRILEBER6YOiEjWUyZma64eUyZkoVf9TCwQBeKmupaYQta5nDRMj7b1+iAWokliAiIhIH+UUFuNkwj1NIbqanlvmfbmhDP71bTSFyMvFAgZadP0QC1AlsQAREREBt7MLcezaHU0hup2tKvO+pakRAhraagpRPVszSR/IyAJUSSxAREREZYmiiL8y8jSF6MRfd5HzyIz2wIOJXDs0skNgYzsENLSFXR15jWZkAaokFiAiIqKnKylVI/5WFo5dfVCITt+4j+LSspWimbOF5u6yNh42MDM2rNZMLECVxAJERET0fPKLShB9/d7DI0R3cTE1u8z7RgYCWrlba44Q+dS1hGEVT+jKAlRJLEBERESVcydXheN/3dUcIbqVWVDm/fq2Zjj4QZcqvWboeb6/q/dYFBEREekluzpyvOrrgld9XSCKIpLu5msupj7+111417WU9IJpFiAiIiKqVoIgoL6dOerbmWNYu3ooVYvIKSx+9obVqGpPvhERERE9g4FMkPwJ0yxAREREpHdYgIiIiEjvsAARERGR3mEBIiIiIr3DAkRERER6hwWIiIiI9A4LEBEREekdFiAiIiLSOyxAREREpHdYgIiIiEjvsAARERGR3mEBIiIiIr3DAkRERER6x1DqANpIFEUAQHZ2tsRJiIiIqKL+/t7++3v8aViAypGTkwMAcHNzkzgJERERPa+cnBxYWlo+dYwgVqQm6Rm1Wo2UlBQoFAoIgiB1HK2UnZ0NNzc3JCcnw8LCQuo4eo9/D+3Cv4f24d9Eu1TX30MUReTk5MDFxQUy2dOv8uERoHLIZDK4urpKHUMnWFhY8P9MtAj/HtqFfw/tw7+JdqmOv8ezjvz8jRdBExERkd5hASIiIiK9wwJEL0Qul+OLL76AXC6XOgqBfw9tw7+H9uHfRLtow9+DF0ETERGR3uERICIiItI7LEBERESkd1iAiIiISO+wABEREZHeYQGiCps5cyb8/f2hUCjg4OCAAQMG4PLly1LHoodmzpwJQRAwZcoUqaPotVu3bmHYsGGwtbWFmZkZWrRogVOnTkkdSy+VlJRg2rRp8PDwgKmpKRo0aICvvvoKarVa6mh64fDhw+jXrx9cXFwgCAK2bt1a5n1RFDF9+nS4uLjA1NQUXbp0wfnz52ssHwsQVVhkZCRCQ0Nx4sQJ7Nu3DyUlJQgKCkJeXp7U0fReTEwMFi1aBB8fH6mj6LX79+8jMDAQRkZG2LVrFy5cuIAffvgBVlZWUkfTS7NmzcKCBQswb948XLx4Ed999x3+97//Ye7cuVJH0wt5eXnw9fXFvHnzyn3/u+++w48//oh58+YhJiYGTk5O6N69u2Y+zurG2+DphWVkZMDBwQGRkZHo1KmT1HH0Vm5uLlq1aoVffvkF33zzDVq0aIHZs2dLHUsvffzxxzh27BiOHDkidRQC0LdvXzg6OmLJkiWadYMGDYKZmRlWrFghYTL9IwgCtmzZggEDBgB4cPTHxcUFU6ZMwUcffQQAUKlUcHR0xKxZszBu3Lhqz8QjQPTCsrKyAAA2NjYSJ9FvoaGh6NOnD1555RWpo+i9bdu2wc/PD2+88QYcHBzQsmVL/Prrr1LH0lsdOnTAn3/+iStXrgAA4uLicPToUfTu3VviZHT9+nWkpaUhKChIs04ul6Nz5844fvx4jWTgZKj0QkRRxNSpU9GhQwd4e3tLHUdvrV27FqdPn0ZMTIzUUQhAQkICwsPDMXXqVHzyySeIjo7GpEmTIJfLMWLECKnj6Z2PPvoIWVlZ8PT0hIGBAUpLS/Htt9/i7bffljqa3ktLSwMAODo6llnv6OiIpKSkGsnAAkQvZMKECYiPj8fRo0eljqK3kpOTMXnyZOzduxcmJiZSxyEAarUafn5+mDFjBgCgZcuWOH/+PMLDw1mAJLBu3TqsXLkSq1evRvPmzaFUKjFlyhS4uLhg5MiRUscjPDg19ihRFB9bV11YgOi5TZw4Edu2bcPhw4fh6uoqdRy9derUKaSnp6N169aadaWlpTh8+DDmzZsHlUoFAwMDCRPqH2dnZ3h5eZVZ16xZM2zatEmiRPrtv//9Lz7++GO89dZbAICXXnoJSUlJmDlzJguQxJycnAA8OBLk7OysWZ+env7YUaHqwmuAqMJEUcSECROwefNmHDhwAB4eHlJH0mvdunXD2bNnoVQqNYufnx+GDh0KpVLJ8iOBwMDAxx4NceXKFdSrV0+iRPotPz8fMlnZrzkDAwPeBq8FPDw84OTkhH379mnWFRUVITIyEgEBATWSgUeAqMJCQ0OxevVq/P7771AoFJpzuJaWljA1NZU4nf5RKBSPXX9lbm4OW1tbXpclkffeew8BAQGYMWMG3nzzTURHR2PRokVYtGiR1NH0Ur9+/fDtt9/C3d0dzZs3x5kzZ/Djjz9i9OjRUkfTC7m5ubh27Zrm9fXr16FUKmFjYwN3d3dMmTIFM2bMQOPGjdG4cWPMmDEDZmZmGDJkSM0EFIkqCEC5y7Jly6SORg917txZnDx5stQx9Noff/whent7i3K5XPT09BQXLVokdSS9lZ2dLU6ePFl0d3cXTUxMxAYNGoiffvqpqFKppI6mFw4ePFjud8bIkSNFURRFtVotfvHFF6KTk5Mol8vFTp06iWfPnq2xfHwOEBEREekdXgNEREREeocFiIiIiPQOCxARERHpHRYgIiIi0jssQERERKR3WICIiIhI77AAERERkd5hASIiegJBELB161apYxBRNWABIiKtFBwcDEEQHlt69uwpdTQiqgU4FxgRaa2ePXti2bJlZdbJ5XKJ0hBRbcIjQESkteRyOZycnMos1tbWAB6cngoPD0evXr1gamoKDw8PbNiwocz2Z8+excsvvwxTU1PY2tpi7NixyM3NLTNm6dKlaN68OeRyOZydnTFhwoQy79+5cwevvfYazMzM0LhxY2zbtk3z3v379zF06FDY29vD1NQUjRs3fqywEZF2YgEiIp312WefYdCgQYiLi8OwYcPw9ttv4+LFiwCA/Px89OzZE9bW1oiJicGGDRuwf//+MgUnPDwcoaGhGDt2LM6ePYtt27ahUaNGZX7Gl19+iTfffBPx8fHo3bs3hg4dinv37ml+/oULF7Br1y5cvHgR4eHhsLOzq7lfABG9uBqbdpWI6DmMHDlSNDAwEM3NzcssX331lSiKoghADAkJKbNN27ZtxXfffVcURVFctGiRaG1tLebm5mre37FjhyiTycS0tDRRFEXRxcVF/PTTT5+YAYA4bdo0zevc3FxREARx165doiiKYr9+/cRRo0ZVzQcmohrFa4CISGt17doV4eHhZdbZ2Nho/rt9+/Zl3mvfvj2USiUA4OLFi/D19YW5ubnm/cDAQKjValy+fBmCICAlJQXdunV7agYfHx/Nf5ubm0OhUCA9PR0A8O6772LQoEE4ffo0goKCMGDAAAQEBLzQZyWimsUCRERay9zc/LFTUs8iCAIAQBRFzX+XN8bU1LRC+zMyMnpsW7VaDQDo1asXkpKSsGPHDuzfvx/dunVDaGgovv/+++fKTEQ1j9cAEZHOOnHixGOvPT09AQBeXl5QKpXIy8vTvH/s2DHIZDI0adIECoUC9evXx59//lmpDPb29ggODsbKlSsxe/ZsLFq0qFL7I6KawSNARKS1VCoV0tLSyqwzNDTUXGi8YcMG+Pn5oUOHDli1ahWio6OxZMkSAMDQoUPxxRdfYOTIkZg+fToyMjIwceJEDB8+HI6OjgCA6dOnIyQkBA4ODujVqxdycnJw7NgxTJw4sUL5Pv/8c7Ru3RrNmzeHSqXC9u3b0axZsyr8DRBRdWEBIiKttXv3bjg7O5dZ17RpU1y6dAnAgzu01q5di/Hjx8PJyQmrVq2Cl5cXAMDMzAx79uzB5MmT4e/vDzMzMwwaNAg//vijZl8jR45EYWEhfvrpJ3zwwQews7PD66+/XuF8xsbGCAsLQ2JiIkxNTdGxY0esXbu2Cj45EVU3QRRFUeoQRETPSxAEbNmyBQMGDJA6ChHpIF4DRERERHqHBYiIiIj0Dq8BIiKdxLP3RFQZPAJEREREeocFiIiIiPQOCxARERHpHRYgIiIi0jssQERERKR3WICIiIhI77AAERERkd5hASIiIiK9wwJEREREeuf/AYDBtRSsLCphAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练Skip-Gram模型\n",
    "learning_rate = 0.001 # 设置学习速率\n",
    "epochs = 1000 # 设置训练轮次\n",
    "criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数\n",
    "import torch.optim as optim # 导入随机梯度下降优化器\n",
    "optimizer = optim.SGD(skipgram_model.parameters(), lr=learning_rate)  \n",
    "\n",
    "# 开始训练循环\n",
    "loss_values = []  # 用于存储每轮的平均损失值\n",
    "for epoch in range(epochs):\n",
    "    loss_sum = 0 # 初始化损失值\n",
    "    for context, target in skipgram_data:        \n",
    "        X = one_hot_encoding(target, word_to_idx).float().unsqueeze(0) # 将中心词转换为One-Hot向量   \n",
    "        y_true = torch.tensor([word_to_idx[context]], dtype=torch.long) # 将周围词转换为索引值   \n",
    "        y_pred = skipgram_model(X)  # 计算预测值\n",
    "        loss = criterion(y_pred, y_true)  # 计算损失\n",
    "        loss_sum += loss.item() # 累积损失\n",
    "        optimizer.zero_grad()  # 清空梯度\n",
    "        loss.backward()  # 反向传播\n",
    "        optimizer.step()  # 更新参数\n",
    "    if (epoch+1) % 100 == 0: # 输出每100轮的损失，并记录损失\n",
    "        print(f\"Epoch: {epoch+1}, Loss: {loss_sum/len(skipgram_data)}\")  \n",
    "        loss_values.append(loss_sum / len(skipgram_data))\n",
    "\n",
    "# 绘制训练损失曲线\n",
    "import matplotlib.pyplot as plt # 导入matplotlib\n",
    "plt.plot(range(1, epochs//100 + 1), loss_values) # 绘图\n",
    "plt.title('Training Loss') # 图题\n",
    "plt.xlabel('Epochs') # X轴Label\n",
    "plt.ylabel('Loss') # Y轴Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "ca992d08",
   "metadata": {},
   "source": [
    "## 第6步：输出Skip-Gram词向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "75e56ed1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Skip-Gram词嵌入:\n",
      "Student:     [0.7595092  0.24590118]\n",
      "is:     [-0.47879416 -0.25787747]\n",
      "Mazong:     [0.38106963 0.3967126 ]\n",
      "Boss:     [0.96846765 0.6014609 ]\n",
      "Xiaoxue:     [0.4819389 0.5664613]\n",
      "Kage:     [0.37162718 0.73662686]\n",
      "Xiaobing:     [0.41746804 0.7186032 ]\n",
      "Teacher:     [0.24550691 0.37696487]\n",
      "Niuzong:     [0.4493814  0.29012886]\n"
     ]
    }
   ],
   "source": [
    "# 输出Skip-Gram习得的词嵌入\n",
    "print(\"\\nSkip-Gram词嵌入:\")\n",
    "for word, idx in word_to_idx.items(): # 输出每个单词的嵌入向量\n",
    "    print(f\"{word}: \\\n",
    "    {skipgram_model.input_to_hidden.weight[:, idx].detach().numpy()}\")  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a1670078",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "findfont: Font family ['SimHei'] not found. Falling back to DejaVu Sans.\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32500 (\\N{CJK UNIFIED IDEOGRAPH-7EF4}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 35789 (\\N{CJK UNIFIED IDEOGRAPH-8BCD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 23884 (\\N{CJK UNIFIED IDEOGRAPH-5D4C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20837 (\\N{CJK UNIFIED IDEOGRAPH-5165}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "findfont: Font family ['SimHei'] not found. Falling back to DejaVu Sans.\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21521 (\\N{CJK UNIFIED IDEOGRAPH-5411}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 37327 (\\N{CJK UNIFIED IDEOGRAPH-91CF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/home/huangjia/ENTER/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 24230 (\\N{CJK UNIFIED IDEOGRAPH-5EA6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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sGFIS0tDSEgIHjx4gObNm2P//v1wcnICADx48EDtnkzfffcdcnNz8cknn+CTTz5Rtfv4+CAiIqKiyyciIqK3kM7dh0kbeB8mIiKiyqciP79LtYYpJCSk2H2JiIiIKrsSB6awsLAS3eixZ8+eJT0FERERkU4pcWDq1KlTedRBREREpLN06tEoRERERLqIgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCQwMBERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCToZGAKCwuDs7MzFAoF2rZtiyNHjryxf3x8PNq2bQuFQoF69eph1apVFVQpERERVQU6F5i2bt0KPz8/BAQE4OzZs+jatSt69+6NxMTEQvvfunULffr0QdeuXXH27FnMmDEDn332GbZv317BlRMREdHbSiaEENou4lUdOnRAmzZtEB4ermpr2rQpBg0ahNDQUI3+06ZNw+7du3H16lVVm6+vL86fP4+EhIRinTMzMxMWFhbIyMiAubn5Px8EERERlbuK/PzWqRmmly9f4syZM/D29lZr9/b2xrFjxwrdJyEhQaN/z549cfr0aeTk5BS6T3Z2NjIzM9VeREREREXRqcCUmpqKvLw82NnZqbXb2dkhOTm50H2Sk5ML7Z+bm4vU1NRC9wkNDYWFhYXqVbt27bIZABEREb2VdCowFZDJZGrvhRAabVL9C2sv4O/vj4yMDNUrKSnpH1ZMREREbzMDbRfwKhsbG+jr62vMJqWkpGjMIhWwt7cvtL+BgQGsra0L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iYiIiEiCgbYLICJ63bFjxzBp0qRCt/Xq1QunT59GampqodtPnjyJVatWYf369YVunzlzJtzc3DBo0KBCt7u6umLjxo0AgM8//xxHjx7FpUuX0LRpU5w7d67EYyGitwMDExHpnMzMTAwaNAhBQUFq7bdv38b06dPx5MmTQsOLh4cHlEol7t+/j2XLlsHDw0Nte0REBFJTU/HixQu0atUKERERGsfo2LGj6v8LITBu3DicOHECFy5cKIOREVFlxcBERFSEb775BgDw6NEjBiaiKo5rmIiIiIgkMDARERERSWBgIiIiIpLAwEREREQkgYGJiIiISAK/JUdEVIQ///wTT548QXJyMp4/f666lYGLiwuMjIy0WxwRVSgGJiKiIkyYMAHx8fGq961btwYA3Lp1C3Xr1tVSVUSkDQxMRERFiIuL03YJRKQjuIaJiIiISAJnmIhI51hYWGDv3r3Yu3evxraePXsiPT0dbm5uhe6rp6eHWrVqYerUqYVunzFjBoyNjXHp0qVCj9GiRYt/VjwRvZVkQgih7SKIiIiIdBkvyRERERFJYGAiIiIiksDARERERCSBgYmIiIhIAgMTERERkQQGJiIiIiIJDExEREREEhiYiIiIiCT8f0ijWynlJyMzAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams[\"font.family\"]=['SimHei'] # 用来设定字体样式\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] # 用来设定无衬线字体样式\n",
    "plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号\n",
    "# 绘制二维词向量图\n",
    "fig, ax = plt.subplots() \n",
    "for word, idx in word_to_idx.items():\n",
    "    vec = skipgram_model.input_to_hidden.weight[:, \\\n",
    "            idx].detach().numpy() # 获取每个单词的嵌入向量\n",
    "    ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点\n",
    "    ax.annotate(word, (vec[0], vec[1]), fontsize=12) # 点旁添加单词标签\n",
    "plt.title('2维词嵌入') # 图题\n",
    "plt.xlabel('向量维度1') # X轴Label\n",
    "plt.ylabel('向量维度2') # Y轴Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27c673b0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
